/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Mensajes;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.xml.ws.BindingProvider;

import com.systelab.modulabgold.server.webservice.request.RequestWS_PortType;
import com.systelab.modulabgold.server.webservice.request.RequestWS_ServiceLocator;

import Consolidado.*;
import Persistencia.conexionBD;

/**
 *
 * @author Administrador
 */
public class Resultado {

	private int idResultado;
	private int idSecuencial;
	private String tipoDato;
	private String idEstudio;
	private String nombreEstudio;
	private String oidEstudio;
	private String resultado;
	private String unidad;
	private String rango;
	private String tipoResultado;
	private String estado;
	private String fecHoraResultado;
	private String msjHl7;

	public Resultado() {
	}

	public void setIdResultado(int idResultado) {
		this.idResultado = idResultado;
	}

	public void setIdSecuencial(int idSecuencial) {
		this.idSecuencial = idSecuencial;
	}

	public void setIdEstudio(String estudioId) {
		this.idEstudio = estudioId;
	}

	public void setTipoDato(String elTipoDato) {
		this.tipoDato = elTipoDato;
	}

	public void setNombreEstudio(String nombre) {
		this.nombreEstudio = nombre;
	}

	public void setFecHoraResultado(String fechaHora) {
		this.fecHoraResultado = fechaHora;
	}

	public void setOidEstudio(String elOidEstudio) {
		this.oidEstudio = elOidEstudio;
	}

	public void setResultado(String elResultado) {
		this.resultado = elResultado;
	}

	public void setUnidad(String laUnidad) {
		this.unidad = laUnidad;
	}

	public void setRango(String elRango) {
		this.rango = elRango;
	}

	public void setTipoResultado(String tipoResult) {
		this.tipoResultado = tipoResult;
	}

	public void setEstado(String elEstado) {
		this.estado = elEstado;
	}

	public void setMsjHl7(String hl7) {
		this.msjHl7 = hl7;
	}

	public int getIdResultado() {
		return idResultado;
	}

	public int getIdSecuencial() {
		return idSecuencial;
	}

	public String getTipoDato() {
		return tipoDato;
	}

	public String getIdEstudio() {
		return idEstudio;
	}

	public String getNombreEstudio() {
		return nombreEstudio;
	}

	public String getFecHoraResultado() {
		return fecHoraResultado;
	}

	public String getOidEstudio() {
		return oidEstudio;
	}

	public String getResultado() {
		return resultado;
	}

	public String getUnidad() {
		return unidad;
	}

	public String getRango() {
		return rango;
	}

	public String getTipoResultado() {
		return tipoResultado;
	}

	public String getEstado() {
		return estado;
	}

	public String getMsjHl7() {
		return msjHl7;
	}

	public static String envioMensajeGEOSALUD(String hl7, int id){
		String NL = "\r";
		String respuesta = "";	
		String medico = "";
		String mensaje = "";
		String[] obrMSJ = null;
		List <Orden> ordenes=new ArrayList <Orden>();

		try {
			//Verifico que exista la solicitud de laboratorio
			ordenes=conexionBD.obtenerOrden("IDOrden = "+id);
			if(ordenes.size() != 0){
				Iterator itr =  ordenes.iterator();
				while(itr.hasNext()) {			    
					Orden ord = (Orden)itr.next();
					String[] msh = ord.getMsjHl7().split("MSH\\|")[1].split("\\|");
					mensaje += "MSH|^~\\&|"+msh[3]+"|"+msh[4]+"|"+msh[1]+"|"+msh[2]+"|"+msh[5]+"||ORU^R01|"+msh[8]+"|P|2.5|||"+NL;
					String[] pid = ord.getMsjHl7().split("PID\\|")[1].split("\\|");
					mensaje += "PID|||"+pid[2]+"||"+pid[4]+"||"+pid[6]+"|"+pid[7] + NL;

					String[] pv1 = ord.getMsjHl7().split("PV1\\|")[1].split("\\|");
					String[] obr = ord.getMsjHl7().split("OBR\\|")[1].split("\\|");
					if (pv1[2].split("\\^").length == 8){
						//mensaje += "PV1|" + ord.getMsjHl7().split("PV1\\|")[1].split("ORC\\|")[0] + NL;
						mensaje += "PV1||"+pv1[1]+"|"+pv1[2]+"||"+obr[1]+";"+obr[3].split("\\^")[0]+"||"+pv1[6]+"|"+NL;
					}else{						
						mensaje += "PV1||"+pv1[1]+"|"+pv1[2]+"^||"+obr[1]+";"+obr[3].split("\\^")[0]+"||"+pv1[6]+"|"+NL;
					}
					obrMSJ = ord.getMsjHl7().split("OBR\\|");
				} 
			}else{	
				return "MSA|AR|8|El numero de orden no existe|1";
			}

			mensaje += "ORC|" + hl7.split("ORC\\|")[1].split("OBR\\|")[0];

			//Armo el mensaje para enviar a GeoSalud
			String[] obr = hl7.split("OBR\\|");
			for(int i = 1; i < obr.length; i++){				
				String[] obx =obr[i].replace("OBX", "|OBX").split("\\|");
				String idEstudio = obx[3];
				String losObxs= "OBR|"+obx[0]+"||"+obx[3]+"|||||||||||||||||||||||||||||||||||||||" + NL;
				for (int obxId = 0; obxId < obx.length; obxId++){
					if (obx[obxId].equals("OBX")){
						losObxs += "OBX|" + obx[obxId+1] + "|" + obx[obxId+2] + "|" + obx[obxId+3] + "||" + 
								obx[obxId+5] + "|" + obx[obxId+6] + "|" + obx[obxId+7] + "|" + obx[obxId+8] + 
								"|||" + obx[obxId+11] + "|||" + obx[obxId+14].substring(0,14) + "||" + NL;
					}
				}

				mensaje += losObxs;
			}

			//Invoco al WS de GEOCOM para enviar resultado


			java.net.URL url = new java.net.URL(conexionBD.obtenerParametros("Descripcion = 'urlWSGeoSalud'").get(0));

			WsHL7V25_RecepcionLocator service = new WsHL7V25_RecepcionLocator();			

			WsHL7V25_RecepcionSoapPort port = service.getwsHL7v25_RecepcionSoapPort(url);	
			WsHL7V25_RecepcionExecute parameters = new WsHL7V25_RecepcionExecute();
			parameters.setInhl7(mensaje);			
			WsHL7V25_RecepcionExecuteResponse result = port.execute(parameters);
			respuesta = result.getOuthl7();

			conexionBD.log("EnvioResultadoGEOSALUD", mensaje, "Envio correcto ", id);

		} catch (Exception e) {

			e.printStackTrace();
			conexionBD.log("EnvioResultadoGEOSALUD", hl7, "Error al enviar", id);
		}

		return respuesta;
	}

	public static String procesarResultado(String hl7){

		String NL = "\r";
		String respuesta = "";	
		String respGeoSalud="";
		String validacion = "";
		int insert=0;
		int id=0;

		SimpleDateFormat formato = new SimpleDateFormat("yyyyMMddhhmmss");
		String fechaServidor = formato.format(new Date()).toString();

		try {
			id = Integer.parseInt(hl7.split("PV1\\|")[1].replace("ORC", "|ORC").split("\\|")[18].replace("\r", "").trim());

			validacion = ValidadorEnvioHL7.validarMsj("ORU^R01", hl7);
			if (validacion.equals("OK")) {				

				respGeoSalud = envioMensajeGEOSALUD(hl7, id).split("MSA\\|")[1];

				if(respGeoSalud.split("\\|")[0].equals("AA")){
					String[] obr = hl7.split("OBR\\|")[1].replace("OBX", "|OBX").split("\\|");

					Resultado resultado = new Resultado();
					resultado.setMsjHl7(hl7);

					resultado.setIdResultado(id);               
					for(int i = 0; i < obr.length; i++){
						if (obr[i].equals("OBX")){
							resultado.setIdEstudio(obr[i+3].split("\\^")[0]);
							resultado.setNombreEstudio(obr[i+3].split("\\^")[1]);
							resultado.setOidEstudio(obr[i+3].split("\\^")[2]);
							resultado.setIdSecuencial(Integer.parseInt(obr[i+1]));
							resultado.setTipoDato(obr[i+2]);
							resultado.setResultado(obr[i+5]);
							resultado.setUnidad(obr[i+6]);
							resultado.setRango(obr[i+7]);
							resultado.setTipoResultado(obr[i+8]);
							resultado.setEstado(obr[i+11]);
							resultado.setFecHoraResultado(obr[i+14]);

							insert = conexionBD.insertResultado(resultado);
						}
					}

					respuesta = "MSH|^~\\&|GEOSALUD||ADT|" + id + "|" + fechaServidor + "||ACK||P|2.5" + NL;
					if (insert == 0) {
						respuesta += "MSA|AR|7|El numero de orden ya existe|1";
					} else {					
						respuesta+= "MSA|AA|0||1";
						conexionBD.log("RecepcionResultado", hl7, "Recibido Ok", id);
					}
				}else{
					respuesta+="MSA|"+respGeoSalud;
				}
				conexionBD.log("RespuestaResultado", respuesta, "Envio Respuesta", id );
			} else {
				conexionBD.log("RecepcionResultado", hl7, "Error. al procesar el resultado", id);
				respuesta = "MSH|^~\\&|GEOSALUD||ADT|" + id + "|" + fechaServidor + "||ACK||P|2.5" + NL
						+ validacion;
			}
		} catch (Exception e) {
			e.printStackTrace();
			conexionBD.log("RecepcionResultado", hl7, "Error. falta alguna linea", id);
			respuesta = "MSH|^~\\&|GEOSALUD||ADT|" + hl7.split("PV1\\|")[1].split("\\|")[18].split("ORC")[0]+ "|" + fechaServidor + "||ACK||P|2.5" + NL
					+ "MSA|AE|99|"+e.toString()+"|1";
		}
		return respuesta;
	}
}
